#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "TD_moteur_jeu.h"
#include "TD_tour.h"
#include "TD_soldat.h"
#include "TD_terrain.h"
#include "TD_joueur.h"

void lancer_jeu(const char * nom_carte[], joueur * Jou,moteur2D *Moteur2D)
{
    terrain * Ter=init_terrain_fichier(nom_carte);
    ensemble_tour * ET=creer_ensemble_tour();
    ensemble_soldat * ES=creer_ensemble_soldat();
    depart * Dep=creer_depart();
    init_jeu(Jou,Ter,Dep,ES,ET);
    boucle_jeu(Jou,Ter,Dep,ES,ET,Moteur2D);
    fin_jeu(Jou,Ter,Dep,ES,ET);
}

void init_jeu(joueur * Jou, const terrain * Ter,depart * Dep, ensemble_soldat * ES, ensemble_tour * ET)
{
    printf("Initialisation\n");
    determine_depart(Dep,Ter);
}

void boucle_jeu(joueur * Jou, const terrain * Ter,const depart * Dep, ensemble_soldat * ES, ensemble_tour * ET,moteur2D *Moteur2D)
{
    int i,j;
    int temps_precedent = 0, temps_actuel = 0;
    int id_proche=-1;
    int PV=10;
    int id_soldat=1;
    int id_tour=1;
    int gen_soldat=0;
    int sortie=0;
    int alea_chemin;
    srand(time(NULL));
    printf("Entrez dans la boucle\n");
    ajout_tour(ET,1,4,10);
    placement_tour(&ET->tours[0]);
    recherche_cases_visables(&ET->tours[0],Ter);

    ajout_tour(ET,2,8,1);
    placement_tour(&ET->tours[1]);
    recherche_cases_visables(&ET->tours[1],Ter);
    SDL_Delay(100);
    while(sortie!=1)
    {
        temps_precedent = SDL_GetTicks();
        afficher_jeu(Ter,Moteur2D);
        // on doit proposer au joueur de creer une tour, de la placer et de la validée

        // TEST :


        // on doit générer des ennemis
        if(gen_soldat%10==0) // A PARAMETRER !! ICI C'EST 10 !! PEUT ETRE ALEATOIRE
        {
            printf("! ON GENERE UN SOLDAT !\n");
            gen_soldat=0;
            alea_chemin=rand()%2+1;
            ajout_soldat(ES,id_soldat,PV,get_x_depart(Dep,alea_chemin),get_y_depart(Dep,alea_chemin));
            id_soldat++;
            if((id_soldat%10)==0)// AUGMENTATION DE LA DIFFICULTER TOUS LES 10 SOLDATS
            {
                PV+=PV; // DOUBLE LES PV
            }
        }

        // on doit faire tirer les tours

        for(i=0;i<get_nb_tours(ET);i++)
        {
            afficher_tourelle(Moteur2D,get_x_tour(&ET->tours[i]),get_y_tour(&ET->tours[i]));
            id_proche=get_id_proche(ES,&ET->tours[i]);
            if(id_proche!=-1)
            {
                for(j=0;j<get_nb_soldats(ES);j++)
                {
                    if(get_id_soldat(&ES->soldats[j])==id_proche)
                    {
                        tir(&ES->soldats[j],&ET->tours[i]);// tir de la tour sur le doldat identifier id_proche
                        printf("!! LA TOUR %d TIR !!\n",get_id_tour(&ET->tours[i]));
                    }
                }
            }
        }

        // on regarde si il y a des soldats mort

        i=0;
        while(i!=get_nb_soldats(ES))
        {
            if(est_mort(&ES->soldats[i]))
            {
                set_plus_score(Jou,get_PVinit_soldat(&ES->soldats[i]));
                // ajoute le nombre de PV initiaux de l'ennemi comme score
                retire_soldat(ES,get_id_soldat(&ES->soldats[i]));
                printf("!!!!! UN SOLDAT EST MORT !!!!!!\n");
            }
            else{
                i++;
            }
        }

        // on doit deplacer les soldats

        for(i=0;i<get_nb_soldats(ES);i++)
        {
            deplacement_soldat(&ES->soldats[i],Ter);
            afficher_soldat(Moteur2D,get_x_soldat(&ES->soldats[i]),get_y_soldat(&ES->soldats[i]));
            if(est_arriver(&ES->soldats[i],Ter)==1)
            {
                set_nb_vies(Jou,-1);
                retire_soldat(ES,get_id_soldat(&ES->soldats[i]));
            }
        }

        // conditions d'arret de la boucle

        if((get_nb_vies(Jou)==0) || id_soldat==100) // plus de vie ou bien il y a eu 100 soldats de lancer
        {
            sortie=1;
        }
        gen_soldat++;
        temps_actuel = SDL_GetTicks();
        SDL_Delay(1000-(temps_actuel-temps_precedent));
    }
}

void afficher_jeu (terrain *Terrain , moteur2D *Moteur2D)
{
    afficher_carte(Moteur2D , Terrain );
    afficher_bordure(Moteur2D);
}

void fin_jeu(joueur * Jou, const terrain * Ter,depart * Dep, ensemble_soldat * ES, ensemble_tour * ET)
{
    detruire_ensemble_tour(ET);
    detruire_ensemble_soldat(ES);
    printf("Fin du jeu.\n");
}
